package com.j.lemon.learn.thread.ObjectInit;

/**
 * @Author lijunjun
 * @Date 2019-04-16 11:24
 * @Description
 *
 * 带有main函数的，先初始化
 * 子类初始化时，先初始化父类
 * 类初始化执行<clinit>方法，由静态变量显示赋值代码和静态代码块组成，顺序是自上而下
 * 类初始化只执行一次
 * （5）（1）（10）（6）
 * 类初始化完毕
 *
 * 实例初始化执行<init>方法，由非静态变量显示赋值和非静态代码块、对应的构造器组成，顺序自上而下，构造器最后执行
 * 每次创建实例对象，执行的就是对应的<init>方法
 * （4）（3）（2）（9）（8）（7）
 * 实例初始化完毕
 *
 * ps:Son重写了Father的test()方法，在创建子类对象时，调用的就是重写后的方法，即子类的test()方法，所以结果是
 * （9）（3）（2）（9）（8）（7）
 */
public class Father {
    private int i = test();
    private static int j = method();
    static{
        System.out.println(1);
    }
    Father(){
        System.out.println(2);
    }
    {
        System.out.println(3);
    }
    public int test() {
        System.out.println(4);
        return 0;
    }

    private static int method() {
        System.out.println(5);
        return 0;
    }


}

class Son extends Father{
    private int i = test();
    private static int j = method();
    static {
        System.out.println(6);
    }
    Son(){
        System.out.println(7);
    }
    {
        System.out.println(8);
    }

    @Override
    public int test(){
        System.out.println(9);
        return 0;
    }
    private static int method(){
        System.out.println(10);
        return 0;
    }

    public static void main(String[] args) {
        Son s1 = new Son();
        System.out.println();
    }
}
